ALTIMA Corp.
2015年7 Rev.1
GNU
ン
Nios II Software Build Tool
GNU
ン
Nios II Software Build Tool
目次
1. ... 3
2. 組込 開発 ... 4
3. GNU ン MAKE ... 5
3-1. GNU ン GCC ... 5
3-2. make ... 6
3-3. GCC 最適化 ... 8
3-4. ... 8
4. ン 役割 ン ... 11
4-1. 構造 ン ... 11
4-1-1. 構造 ン ...11
4-1-2. 自動生成 ン linker.x ... 14
4-2. ... 17
5. BSP (BOARD SUPPORT PACKAGE) い ... 18
6. わ ... 19
7. 参考文献 ... 19
GNU ン Nios II Software Build Tool
1.
資料 Nios ®
II Software Build Tool 降 Nios II SBT 使用 際 GNU
ン や ン 初歩的 概念 体系的 明 資料 Nios II 外 CPU
GNU ン 経験 設計者や 使用 組込 開発
設計者 Quartus
®
II 開発 用 内容 4章 降 設計者
見 高 内容 含 い 参考 留 い
対象 ン: Quartus II v15.0
Nios II SBT v15.0
2.
組込
開発
最初 組込 開発 概略 紹
作成
開発環境や 使用 ン 言語 C/C++ 記述
C/C++ ン
C/C++ ン ン 言語 ン 言語 変換 Nios II SBT GNU
C/C++ ン GCC 使用
ン
ン ン 言語 変換
※ FPGA 開発 Quartus II ン ン 異 FPGA/CPLD 書
込 .sof / .pof 生成 行い
ン
ン や 情報 集約 結合 最終的 実行 ELF
生成 Nios II SBT ELF 拡張子 .elf 表記
ン ROM化 生成
GNU ELF S 変換
Nios II SBT S 拡張子 .flash 表記
ン 実機動作
Nios II SBT JTAG JTAG_UART 経由 S RAM
格納 実行 FPGA開発 SOF 書込 相当
ROM 化 書込
Nios II SBT Flash Programmer JTAG 経由 S ROM 書込
GNU ン Nios II Software Build Tool
3.
GNU
ン
make
3-1.GNU ン GCC
GCC GNU Compiler Collection 先頭 3文 GNU C ン 意味 略語
組込 用途 ン 様々 ン 在 昨 最 普及 い
GCC 図3-1 前章 ン GNU 少 踏 込 内容
図3-1. GCC ン ROM 化
GNU ン Quartus II 様 ン cpp0 → ン
cc1 → ン as → ン ld 実行 GCC ン ン gcc ン
指定 ば ン 実施 実行 生成 Nios II SBT
図3-2 う nios2-elf-gcc ン 提供 引数
foo.c –v ン 付加 い –v ン ン 処理 各段階 い 実行
ン 表示 ン
ン
ン
ン
ROM化
ROM化 (S , Hex)
実行 ELF
(objcopy)
foo.flash, foo.hex main.c
GCC ン
sub_1.c sub_2.c
main.i sub_1.i sub_2.i
main.s sub_1.s sub_2.s
main.o sub_1.o sub_2.o 必要
foo.elf
ン (cc1)
ン (as)
(cpp0)
ン (ld)
図3-2. gcc ン 例
gcc ン ン 行う cc1 や as 背後 実行 い 確認
図3-3 う ン 指定 ば 段階 踏 ン 可能
図3-3. gcc ン 例
う gcc ン ン 指 あ GCC C ン cc1 区
別 ン ば あ 実際 図3-3 う 単純 様々
ンや関連 設定 目 追加 例: -g ン -I ン
3-2.make
gcc 対 複雑 設定 目 毎 設定 用意 所定 記
録 変更 う 組 利用 ば便利 GNU GNU make (gmake) いう
用意 ン ン PATH 様々 設定 毎 管理
毎 設定 いう意味 Quartus II QSF Quartus II 設定 部
分的 似 い
Nios II SBT make
Nios II SBT 毎 make 自動生成 図3-4 make 一部
抜粋 make 作 現実的 あ 精通 方 除
際 自動生成 推奨
[NiosII EDS]$ nios2-elf-gcc foo.c -v
[NiosII EDS]$ nios2-elf-gcc foo.c -v -S [NiosII EDS]$ nios2-elf-gcc foo.c -v -o foo.o
-S ン:
cc1 実施
ン 生成
-o ン:
as 実施
GNU ン Nios II Software Build Tool
図3-4. Nios II SBT 自動生成 make 一部抜粋
Nios II SBT 作成 make 自動生成 ン ン ン
make あ 移動 図3-5 う make make all
GNU make gcc ン 実行 ELF 生成
ン ン 処理 過程 表示 追う 確認
図3-5. make 例
make 図3-6 う 後 make clean 状態
前 状態 戻 消え
図3-6. make 例
make 複数 ン う 開発 場合 修
ン 見 修 再 ン 既 ン
行い 整合 保 役割 持 い 意味
Quartus II Smart Compilationや ン ン ン 似 い 知
.PHONY : all
all:
@$(ECHO) [$(APP_NAME) build complete]
all : build_pre_process libs app build_post_process
$(OBJ_ROOT_DIR)/%.o: %.c
@$(ECHO) Info: Compiling $< to $@
@$(MKDIR) $(@D)
$(CC) -MP -MMD -c $(APP_CPPFLAGS) $(APP_CFLAGS) -o $@ $<
$(CC_POST_PROCESS)
$(OBJ_ROOT_DIR)/%.o: %.cpp @$(ECHO) Info: Compiling $< to $@
@$(MKDIR) $(@D)
$(CXX) -MP -MMD -c $(APP_CPPFLAGS) $(APP_CXXFLAGS) $(APP_CFLAGS) -o $@ $<
$(CXX_POST_PROCESS)
$(OBJ_ROOT_DIR)/%.o: %.cc
@$(ECHO) Info: Compiling $< to $@
@$(MKDIR) $(@D)
$(CXX) -MP -MMD -c $(APP_CPPFLAGS) $(APP_CXXFLAGS) $(APP_CFLAGS) -o $@ $<
$(CXX_POST_PROCESS)
CROSS_COMPILE := nios2-elf- CC := $(CROSS_COMPILE)gcc -xc CXX := $(CROSS_COMPILE)gcc -xc++ AS := $(CROSS_COMPILE)gcc AR := $(CROSS_COMPILE)ar LD := $(CROSS_COMPILE)g++ NM := $(CROSS_COMPILE)nm RM := rm -f
OBJDUMP := $(CROSS_COMPILE)objdump OBJCOPY := $(CROSS_COMPILE)objcopy STACKREPORT := nios2-stackreport DOWNLOAD := nios2-download FLASHPROG := nios2-flash-programmer ELFPATCH := nios2-elf-insert
MKDIR := mkdir -p
[NiosII EDS]$ make all
3-3.GCC 最適化
GCC ン ン 中 最適化 ン 紹 Quartus II 様 GCC
ン 考慮 複数 最適化 用意 い
◇ -O :-O1
◇ –O0 :最適化 0
最適化 行い GCC や い 生成
◇ -O1 :最適化 1
ン 実行 間 両方 削減 ン 間
-O0 場合 減 CPU内蔵 汎用 値
保 う 最適化 行わ
◇ -O2 :最適化 2
-O1 最適化 行い ほ 全 最適化 行い ン 間
長 生成 概 高速化
◇ -O3 :最適化 3
-O2 指定 全 最適化 行い 展開や ン ン展開 実施
◇ -Os :最適化 s
-O2 指定 最適化 中 実行 間 削減 優先 最適化
行わ
3-4.
実行 操作 あ Binutils (GNU Binary Utilities)
ば い 表的 紹
◇ objcopy : 表的 使用用途 ROM 化 際 変換 あ
Nios II SBT 図3-7 う nios2-elf-objcopy ン 提供 -I
GNU ン Nios II Software Build Tool
図3-7. objcopy 例
◇ nm : ン 表示 Nios II SBT 図 3-8 う
nios2-elf-nm ン 提供 nios2-elf-nm ン 出力
ン機能 使用 foo.nm いう 出力 い
図3-8. nm 例
※ ン :
C 言語 変数や関数 定義 実体 利用可能 空間
領域 確保 意味 変数 や関数 確保 領
域 あ 言え 関数や変数 単 前 扱わ
前 ン
※ ン :
ン 管理 ン 情報 ン ン ン
実体 配置位置 情報 関数や変数 在
ン 情報 管理 ン 配列 持 い
[NiosII EDS]$ nios2-elf-objcopy -I srec -O ihex foo.flash foo.hex [NiosII EDS]$ nios2-elf-objcopy -O srec foo.elf foo.flash
[NiosII EDS]$ nios2-elf-objcopy -I srec -O binary foo.flash foo.bin
ELF S 変換
S HEX 変換
S 変換
◇ objdump : 情報 表示 表的 ン 紹
■ --disassemble: 逆 ン 行い
■ --syms: ン 情報 表示
■ --all-header: ELF 情報 表示
■ --source: 逆 ン 元 対比 表示
Nios II SBT 図3-9 う nios2-elf- objdump ン 提供
図3-9. objdump 例
◇ size : 表 示 ン 表 示 Nios II SBT 図 3-10 う
nios2-elf-size ン 提供
図3-10. size 例
◇ readelf : ELF 情報 情報や ン 情報 表示 Nios II SBT 図3-11
う nios2-elf- readelf ン 提供 出力
ン
図3-11. readelf 例
[NiosII EDS]$ nios2-elf-objdump --disassemble --syms --all-header --source foo.elf > foo.objdump
[NiosII EDS]$ nios2-elf-size foo.elf
text data bss dec hex filename 67200 7612 532 75344 12650 foo.elf
GNU ン Nios II Software Build Tool
4.
ン
役割
ン
ン や ン 複数 や 元々 用意 い
複数 ン 結合 ン へ 指示書 従 や
空間 配置 ン へ 指示書 ン いい 図3-1 GCC ン
示 い ン ン 込 ン 作業 行い 最終的
結合 解決 情報 解決 実行 生成 解決 い
資料 割愛
4-1. 構造 ン
C 言語 設計者 作成 作成中
場所 配置 い 問題 厳密 考え い 最後
あ 配置 ば
C 言語 構造 + 構成 い 構造 個々
異 性質 持 い 配置場所 別々 考え
4-1-1. 構造 ン
図4-1 性質 異 構造 具体例 簡易的 明 い 記述
変数や関数 ン 段階 う 構造 分類 い 最終的
う 配置 い 図示 い
用途 応 性質 異 領域 分割 い 個々 領域
ン いい ン .bss や .text いう う ン 先頭 .
付 表現
図4-1 初期値 指定 変数や配列 .rwdata ン 分類
変数 定数 初期値 指定 専用 .rodata 分類
初期値 持 い配列 .bss ン 分類 main 関
数 .text ン 分類 .text ン ROM
う 不揮発性 常駐 .rodata ン 専用 不揮発性 配置
.rwdata ン .bss ン RAM う 書 換え可能 揮発性 内 配置
一般的 初期値 無 実 無 着目 .rwdata ン .bss ン
別々 性質 持 見 両者 RAM 別々 領域 配置 必要 あ
図4-1. ン 配置 い 様子
基 領域
C 言語 領域 確保 要 大雑把 3
領域 分類
◇ 領域 : 変数 auto 変数 関数 引数 確保
◇静的記憶領域 : 変数 static 変数 確保
◇動的記憶領域 : 動的 確保 領域 領域 確保
#include <stdio.h>
#include “system.h”
#define BUFF_SIZE 5
int buff_1[BUFF_SIZE]; ←
int buff_2[BUFF_SIZE]; ←
int buff_3[BUFF_SIZE] = {0, 1, 2, 3, 4 }; ←
const int coeff_1[BUFF_SIZE] = {5,6,7,8,9};←
int main(void) {
int i;
static int a_val; ← static int b_val = 1; ←
for(i=0; i< BUFF_SIZE; i++) {
a_val = i+1; b_val = i+2;
buff_1[i] = 2*a_val; buff_2[i] = 3*b_val;
buff_3[i]= buff_1[i] + (coeff_1[i])*(buff_2[i]); }
return (0); }
変数
.bss ン
→ 配列変数buff_1
→ 配列変数buff_2
→ 変数a_val
.rwdata ン
→ 配列変数buff_3
→ 変数b_val
.rodata ン
→ 配列定数 coeff_1
変数
見 構造 ン 見 構造
見 構造
.bss ン
.rwdata ン
.text ン
ROM RAM
CPU
.text ン
→ main関数
GNU ン Nios II Software Build Tool
実行 ELF 外 様々 形式 a.out あ 共通 3
構造 紹
◇ 領域: 配置 専用 禁
◇ 領域: 初期値 持 変数 体 配置 可能 変数
や static 変数 配置対象 auto 変数 対象外
◇BSS領域: BSS Block Started by Symbol 略語 あ 初期値 持 い変数 配置
auto 変数 配置 対象外
ELF 出力 GNU ン ン
ELF 出力 GNU 定義 表的 ン 紹
◇ .text ン: 領域 通常 ROM 配置 ン ン 外部
RAM 指定 場合 ROM 化 際 Nios II Flash Programmer
ALTERA 提供 専用 付加 自動的 行い 後
起動 RAM .text ン
◇ .data ン: 領域 初期値 持 変数 RAM 配置 初期値 持 い
変数 .data ン .common ン 配置
ン 依
◇ .bss ン: BSS 領域 初期値 持 い変数 RAM 配置 関数内 構造体 動
的記憶領域 配置 領域や malloc() 等 配置
注: malloc() 引数 指定 数 領域 動的 確保
領域 領域内 割 当 ン 依
free() 領域 開放 い 空 容 食い潰
い 注意 必要
◇ .rodata ン: 専用 配置 const 言 文 列
主 配置
◇ .common ン: 初期値 持 い 変数 RAM 配置
◇ .stub ン .stubstr ン: GDB 情報 配置
情報や行番号 い 情報 集約 い GDB
GNU 指
◇ .comment ン: や 刻情報 配置
◇ .rwdata ン: 可能 RAM 配置 Nios II SBT 値0 初
期値 見
◇ .entry ン: Nios II SBT ン 自動的 配置
◇ . ( ) ン: Nios II SBT system.h 定義
Qsys ン ネン 関連
ン 自動的 定義
例: .ext_flash, .ext_ssram, .ddr_sdram_0
◇ 定義 ン: Nios II SBT BSP Editor 使用 GUI
任意 定義
4-1-2. 自動生成 ン linker.x
Nios II SBT linker.x いう ン 生成 後述 bsp
内 生成 linker.x 概 次 う 記述 構成 い
MEMORY ン
位置 大 定義 ン 領域 使 良い 領域
使 い い 記述 必要 数 定義 様 設定 Nios II
SBT BSP Editor GUI 行う
図4-2. MEMORY ン
OUTPUT_FORMAT ン
出力 や ン ン 指定
図4-3. OUTPUT_FORMAT ン
MEMORY {
reset : ORIGIN = 0x0, LENGTH = 32
ext_flash : ORIGIN = 0x20, LENGTH = 16777184 ext_ssram : ORIGIN = 0x1000000, LENGTH = 2097152
onchip_ram_BEFORE_EXCEPTION : ORIGIN = 0x2100000, LENGTH = 32 onchip_ram : ORIGIN = 0x2100020, LENGTH = 65504
epcs_controller : ORIGIN = 0x3200000, LENGTH = 2048 ddr_sdram_0 : ORIGIN = 0x4000000, LENGTH = 33554432 }
0x2100020 番 地 基 65504
バイ 分の 領域を確保
GNU ン Nios II Software Build Tool
OUTPUT_ARCH ン
指定
図4-4. OUTPUT_ARCH ン
ENTRY ン
ン ン 設定 ン ン 最初 実行 へ ン
開始
図4-5. ENTRY ン
OUTPUT_ARCH( nios2 )
SECTIONS ン
ン ンや ン 空間 配置
SECTIONS {
.entry : {
KEEP (*(.entry)) } > reset
.exceptions : {
<< 途中省略 >> } > onchip_ram
.text : {
<< 途中省略 >>
} > ddr_sdram_0 = 0x3a880100
.rodata : {
PROVIDE (__ram_rodata_start = ABSOLUTE(.)); . = ALIGN(4);
*(.rodata .rodata.* .gnu.linkonce.r.*) *(.rodata1)
. = ALIGN(4);
PROVIDE (__ram_rodata_end = ABSOLUTE(.)); } > ddr_sdram_0
<< 途中省略 >>
.rwdata : {
<< 途中省略 >> } > ddr_sdram_0 .bss :
{
<< 途中省略 >> } > ddr_sdram_0 .ext_flash : {
<< 途中省略 >> } > ext_flash .ext_ssram : {
<< 途中省略 >> } > ext_ssram
<< 途中省略 >>
.stab 0 : { *(.stab) } .stabstr 0 : { *(.stabstr) } .stab.excl 0 : { *(.stab.excl) }
<< 途中省略 >> }
ン 対象 全
内
.entry ン
集 約 結 合 最
終的 MEMORY
ン 定義
reset領域 .entry
ン 配置
.entry ン 続
い .exceptions ン → .text
ン 所 定
領 域
配置
.rodata ン 開始 __ram_rodata_start
ン ボ 設 定 (開 始 現 行 位 置 ン
値 位置 ンタを4ワ 境界 るよう 調整後
ンク対象の全て ク イ の以下のセク
ョンを集約 結合
.rodata .rodata.* .gnu.linkonce.r.* .rodata1
位置 ンタを4ワ イン後 終了
__ram_rodata_end ンボ 設定(終了 現行
位置 ン 値 結合 4ワ イン
調整した分をインク ン
各 ン
MEMORY
ン 定 義
所 定
領域内
記述
配置
系
ン 記
述 集
約 結合
■ ン . 位置
ン 意 味 ン う
初期値 ン
■ ン *
ワ 意味
■ ン ン 定義 C言語 定義 い 変数 や関数 間 ン 衝突 起 可能性
出 防 PROVIDE ン = 値 利 用 内 ン 定 義
GNU ン Nios II Software Build Tool
4-2.
attribute
ン 使用 い 直接 ン 指定 図4-7
う GCC 提供 い 関数 "__attribute__" 機能 使用 特定 変数や関数 任意
ン 配置 可能 ANSI C #pragma あ attribute 機能 使用 強 推奨
図4-7. attribute 使用例
※#pragma:
attribute 機能 様 領域へ 配置
明示 ン 固 拡張機能 あ CPU
移植 場合 互換性 注意 必要
ン 何 配置 形式 あ ン ld 出力
ン 指定通 空間 配置 う 確認 利用 Nios II
SBT 図4-8 う nios2-elf- ld ン -M ン 提供 出力
ン
図4-8. 生成例
int foo_var __attribute__ ((section (".data_tcm"))) = 0;
/* 変数foo_varを .data_tcm セク ョン 配置 */
void bar_func(void* ptr) __attribute__((section (".ext_ssram")));
/* 関数bar_func()を.ext_ssram セク ョン 配置 */
5.
BSP (Board Support Package)
い
固 ンや OS 結 ン
指
BSP (Board Support Package) OS や CPU 提供
あ 実体 CPU 特定 OS 実行 必要
や 集合体 Nios II SBT 場合 Qsys 内 ン ネン 用
や HAL 関連 や BSP 内
展開
図5-1. 階 関係
Nios II SBT ン や make 設定 最適化 ン等 GCC 関連
各種設定 Nios II SBT BSP Editor GUI 設定
ン
標準C
HAL API
Nios® II
ン Nios II SBT
ン 内 格納
各 種 や
尾 _bsp
GNU ン Nios II Software Build Tool
6.
わ
Nios II SBT GNU や ン 対 設定 柔軟行え 精通 い 設計者
用 GUI GNU や ン 概念 考慮 使用 伴う恐
あ 資料 GNU や ン 概念 持 後 次章 紹 参考文献や専門
通 理解 深
尚 GNU AS IS 無保証 表記 い 不具合 自己解決 いう
暗黙 在 扱い 十分 注意 願い
7.
参考文献
1. GNU ン ン
Mike Loukides & Andy Oram 共著 引地美恵子 引地信之 共訳
2. 実例 学ぶ GCC 格的活用法 CQ 出版社 岸哲夫著
3. MAKE 遉人 株式会社 ン C. ン / A. ネ ン ン / E. ン 共著 小川 夫訳
4. 組 込 OS 基礎講 株式会社翔泳社
ン / ン 共著 宇 訳
5. ン 実践開発 CQ 出版社 坂井 弘亮著
免責 利用 注意
弊社 資料 入手 様 記 使用 注意 一 い い 使用 い
1. 資料 非売品 許可無 転売 や無断複製 禁
2. 資料 予告 変更 あ
3.
改版
歴
Revision 年 概要